// 创建并初始化变量
var name = "kunkun";
// 显示声明
String nickname = "ikun";

// 空安全：防止意外访问 null 的变量而导致的错误（空解引用错误）
// 使用非空变量之前需要初始化
// 默认值为 null
String? username;

int? lineCount;

void main() {
  print(username); // null

  print(lineCount);

  assert(lineCount == null); // 断言

  fn();

  fn2();

  fn3();
}

// 延迟初始化变量，使用 late 修饰符
/* late 修饰符的两种用法：
  - 声明一个非空变量，但不在声明时初始化
  - 延迟初始化一个变量
 */

late String description;
void fn() {
  description = 'hello dart';
  print(description);
}

// 终值与常量

// 终值 final
final language = 'dart';
final String platform = 'android';

// 常量 const
// const bar = 100;
// const double atm = 1.01325 * bar;

// const 可以创建常量值
var foo = const [];
final bar = const [];
const baz = []; // 等价于 const []

// final 对象不能被修改，但对象的属性可以修改，const 对象和属性都不能修改
final obj = {'name': 'kunkun', 'age': 18};

void fn2() {
  print(obj);
  obj['age'] = 19;
  print(obj);
}

// 会运行报错
const obj2 = {'name': 'kunkun', 'age': 18};
void fn3() {
  print(obj2);
  obj2['age'] = 19;
  print(obj2);
}
